package com.ea.admin.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ea.admin.mapper.AdminRoleMapper;
import com.ea.admin.mapper.DefaultCompanyConfMapper;
import com.ea.admin.pojo.param.config.EditConfItemParam;
import com.ea.admin.pojo.po.AdminRole;
import com.ea.admin.pojo.po.DefaultCompanyConf;
import com.ea.admin.pojo.vo.superAdmin.DefaultCompanyConfVo;
import com.ea.admin.pojo.vo.superAdmin.DefaultFunctionPermissionVo;
import com.ea.admin.pojo.vo.superAdmin.GetDefaultConfVo;
import com.ea.admin.pojo.vo.superAdmin.GetDefaultFunctionPermissionVo;
import com.ea.admin.service.ConfigService;
import com.ea.admin.service.FunctionPermissionService;
import com.ea.admin.service.PropertiesService;
import com.ea.common.mybatis.UpdateBatchWrapper;
import com.ea.common.result.BizException;
import com.ea.common.result.ErrorCode;
import com.ea.common.utils.ParamUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;

@Service
public class ConfigServiceImpl implements ConfigService {
    @Resource
    DefaultCompanyConfMapper defaultCompanyConfMapper;
    @Resource
    AdminRoleMapper adminRoleMapper;
    @Resource
    FunctionPermissionService functionPermissionService;
    @Resource
    PropertiesService propertiesService;

    @Override
    public GetDefaultConfVo getDefaultConf() {
        // 获得系统默认配置
        LambdaQueryWrapper<DefaultCompanyConf> wrapper = new LambdaQueryWrapper<>();
        wrapper.notIn(DefaultCompanyConf::getDefaultCompanyConfId, 20, 36, 52);
        wrapper.orderByAsc(DefaultCompanyConf::getDefaultCompanyConfId);
        List<DefaultCompanyConf> defaultConf = defaultCompanyConfMapper.selectList(wrapper);
        return parseDefaultCompanyConfToMap(defaultConf);
    }

    private GetDefaultConfVo parseDefaultCompanyConfToMap(List<DefaultCompanyConf> defaultConf) {
        GetDefaultConfVo vo = new GetDefaultConfVo();
        vo.setConf(new HashMap<>(defaultConf.size()));
        for (DefaultCompanyConf defaultCompanyConf : defaultConf) {
            vo.getConf().put(defaultCompanyConf.getConfKey(), parseDefaultCompanyConfToVo(defaultCompanyConf));
        }
        return vo;
    }

    private DefaultCompanyConfVo parseDefaultCompanyConfToVo(DefaultCompanyConf defaultCompanyConf) {
        DefaultCompanyConfVo vo = new DefaultCompanyConfVo();
        vo.setDefaultCompanyConfId(defaultCompanyConf.getDefaultCompanyConfId().toString());
        vo.setValueType(defaultCompanyConf.getValueType());
        if (defaultCompanyConf.getValueType() == 0) {
            vo.setLowerValue(defaultCompanyConf.getLowerValueInt());
            vo.setUpperValue(defaultCompanyConf.getUpperValueInt());
            vo.setInitialLowerValue(defaultCompanyConf.getInitLowerValueInt());
            vo.setInitialUpperValue(defaultCompanyConf.getInitUpperValueInt());
        } else if (defaultCompanyConf.getValueType() == 1) {
            vo.setLowerValue(defaultCompanyConf.getLowerValueString());
            vo.setUpperValue(defaultCompanyConf.getUpperValueString());
            vo.setInitialLowerValue(defaultCompanyConf.getInitLowerValueString());
            vo.setInitialUpperValue(defaultCompanyConf.getInitUpperValueString());
        }
        return vo;
    }

    @Override
    public void editDefaultConf(List<EditConfItemParam> conf) {
        List<DefaultCompanyConf> updateList = new ArrayList<>();
        List<Long> defaultCompanyConfIdList = new ArrayList<>();
        List<String> propertiesNameList = new ArrayList<>();
        conf.forEach(item -> {
            DefaultCompanyConf defaultCompanyConf = new DefaultCompanyConf();
            defaultCompanyConf.setDefaultCompanyConfId(ParamUtil.parseId(item.getCompanyConfId()));
            if (item.getValueType() == 0) {
                try {
                    defaultCompanyConf.setLowerValueInt((Integer) item.getLowerValue());
                    defaultCompanyConf.setUpperValueInt((Integer) item.getUpperValue());
                } catch (Exception e) {
                    throw new BizException(ErrorCode.USER_PARAM_ERROR);
                }

            } else if (item.getValueType() == 1) {
                defaultCompanyConf.setLowerValueString((String) item.getLowerValue());
                defaultCompanyConf.setUpperValueString((String) item.getUpperValue());
                if (7 <= defaultCompanyConf.getDefaultCompanyConfId() && defaultCompanyConf.getDefaultCompanyConfId() <= 22) {
                    if
                    (Objects.equals(defaultCompanyConf.getLowerValueString(), "外向性") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "稳定性") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "生理情绪") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "正面情绪") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "负面情绪") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "心理变化率") ||
                            Objects.equals(defaultCompanyConf.getLowerValueString(), "心理测试频谱图")
                    ) {
                        throw new BizException(ErrorCode.USER_PARAM_ERROR_CUSTOM_INDEX_NAME_ERROR);
                    }
                    defaultCompanyConfIdList.add(defaultCompanyConf.getDefaultCompanyConfId());
                    propertiesNameList.add(defaultCompanyConf.getLowerValueString());
                }
            }
            updateList.add(defaultCompanyConf);
        });

        defaultCompanyConfMapper.updateBatchById(updateList,
                new UpdateBatchWrapper<DefaultCompanyConf>().setUpdateFields(
                        DefaultCompanyConf::getLowerValueInt,
                        DefaultCompanyConf::getUpperValueInt,
                        DefaultCompanyConf::getLowerValueString,
                        DefaultCompanyConf::getUpperValueString
                ));
        // 如果配置值在 7-22 之间，更新 properties info 表
        propertiesService.updatePropertiesByCompanyConf(defaultCompanyConfIdList, propertiesNameList);
    }

    @Override
    public GetDefaultFunctionPermissionVo getDefaultFunctionPermission() {
        // 获得所有的管理员角色
        List<AdminRole> adminRoleList = adminRoleMapper.selectList(null);
        // 依次获得对应的权限
        GetDefaultFunctionPermissionVo result = new GetDefaultFunctionPermissionVo();
        result.setMap(new HashMap<>(adminRoleList.size()));
        adminRoleList.forEach(adminRole -> {
            DefaultFunctionPermissionVo vo = new DefaultFunctionPermissionVo();
            vo.setAdminRoleId(adminRole.getAdminRoleId().toString());
            vo.setFunctionPermissionList(functionPermissionService.getDefaultFunctionPermission(adminRole.getAdminRoleId()));
            result.getMap().put(adminRole.getAdminRoleName(), vo);
        });
        return result;
    }

}
